﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using fideeraSoft.Utils;
using fideeraSoft.DAO;
using fideeraSoft.Entities;

namespace fideeraSoft.DAOimpl
{
    public class UsuarioDAOSQLimpl : UsuarioDAO
    {
        #region ALTA DE USUARIO
        public void altaUsuario(Usuario usuario)
        {
            SqlConnection conn = null;
            try
            {
                conn = SQLclass.conectarSQL();
                conn.Open();

                string query = "SET IDENTITY_INSERT Usuario ON; INSERT INTO Usuario (ID,nombre,apellido,dni,username,pass,email,tel,cel,jerarquia) VALUES (@IdUsuario,@Nombre,@Apellido,@Dni,@UserName,@Pass,@Email,@Tel,@Cel,@Jerarquia)";
                //string query = "INSERT INTO Proveedor (razonSocial,responsable,cuil,direccion,localidad,provincia,telefono,celular) VALUES (@RazonSocial,@Responsable,@Cuil,@Direccion,@Localidad,@Provincia,@Telefono,@Celular)";
                SqlCommand cmd = new SqlCommand(query, conn);

                cmd.Parameters.AddWithValue("@IdUsuario", usuario.IdUsuario);
                cmd.Parameters.AddWithValue("@Nombre", usuario.Nombre);
                cmd.Parameters.AddWithValue("@Apellido", usuario.Apellido);
                cmd.Parameters.AddWithValue("@Dni", usuario.Dni);
                cmd.Parameters.AddWithValue("@Username", usuario.Username);
                cmd.Parameters.AddWithValue("@Pass", usuario.Pass);
                cmd.Parameters.AddWithValue("@Email", usuario.Email);
                cmd.Parameters.AddWithValue("@Tel", usuario.Tel);
                cmd.Parameters.AddWithValue("@Cel", usuario.Cel);
                cmd.Parameters.AddWithValue("@Jerarquia", usuario.Jerarquia);

                cmd.ExecuteNonQuery();
                //cmd.Parameters.Clear();
                // cmd.CommandText = "SELECT @@IDENTITY";
                // int insertID=Convert.ToInt32(cmd.ExecuteScalar());

                //  cmd.Dispose();
                cmd = null;

                //cmd.Connection.Close();
                /*DataTable dt = new DataTable();
                DA.Fill(dt);
                */
            }
            catch (Exception e)
            {
                CLogger.Append("[altaUsuario] Exception alta: " + e, CLogger.ERROR);      //DEBUG
                throw new MiException("[altaUsuario] Exception alta: " + e);
            }
            finally
            {
                conn.Close();
            }

        }
        #endregion

        #region BUSCAR NUEVO ULTIMO ID DE USUARIO EN BASE DE DATOS
        public int buscarNuevoUltimoIdUsuarioEnBD()
        {
            int ID = 0;
            SqlConnection conn = SQLclass.conectarSQL();
            try
            {
                conn.Open();

                string query = "SELECT TOP 1 ID FROM Usuario ORDER BY ID DESC ";
                SqlCommand cmd = new SqlCommand(query, conn);

                SQLclass.commandQuery(conn, cmd, query);
                SqlDataReader reader = cmd.ExecuteReader();

                if (reader.HasRows)
                {

                    while (reader.Read())
                    {
                        ID = reader.GetInt32(0);
                        //  CLogger.Append("[buscarNuevoUltimoIdProveedorEnBD] ID : " + ID, CLogger.ERROR);      //DEBUG
                    }
                    ID++;
                }
                else
                {
                    ID = 1;
                }
            }
            catch (Exception e)
            {
                CLogger.Append("[buscarNuevoUltimoIdProveedorEnBD] Exception : " + e, CLogger.ERROR);      //DEBUG
                throw new MiException("[buscarNuevoUltimoIdProveedorEnBD] Exception: " + e);
            }
            finally
            {
                conn.Close();
            }
            // CLogger.Append("[buscarNuevoUltimoIdProveedorEnBD] RETURN ID : " + ID, CLogger.ERROR);      //DEBUG
            return ID;
        
        }
        #endregion

        public List<Jerarquia> obtenerJerarquiasFromDB()
        { 
            List<Jerarquia> lstJerarquia=null;

            SqlConnection conn = SQLclass.conectarSQL();
            try
            {
                conn.Open();

                string query = "SELECT * FROM Jerarquia";
                SqlCommand cmd = new SqlCommand(query, conn);

                SQLclass.commandQuery(conn, cmd, query);
                SqlDataReader reader = cmd.ExecuteReader();

                if (reader.HasRows)
                {
                    lstJerarquia=new List<Jerarquia>();
                    Jerarquia jerarquia;
                    
                    while (reader.Read())
                    {
                        jerarquia = new Jerarquia();

                        jerarquia.IdJerarquia  = reader.GetInt32(0);
                        
                        jerarquia.Descripcion = reader.GetString(1);
                        //  CLogger.Append("[buscarNuevoUltimoIdProveedorEnBD] ID : " + ID, CLogger.ERROR);      //DEBUG
                        lstJerarquia.Add(jerarquia);
                    }                    
                }
                else
                {
                    lstJerarquia = null;
                }
            }
            catch (Exception e)
            {
                CLogger.Append("[buscarNuevoUltimoIdProveedorEnBD] Exception : " + e, CLogger.ERROR);      //DEBUG
                throw new MiException("[buscarNuevoUltimoIdProveedorEnBD] Exception: " + e);
            }
            finally
            {
                conn.Close();
            }
            // CLogger.Append("[buscarNuevoUltimoIdProveedorEnBD] RETURN ID : " + ID, CLogger.ERROR);      //DEBUG
            return lstJerarquia;
        }


        public Usuario buscarUsuarioPorDNI(string dni)
        {
            Usuario usuario = null;

            SqlConnection conn = SQLclass.conectarSQL();
            try
            {
                conn.Open();

                string query = "SELECT * FROM Usuario WHERE dni='"+dni+"'";
                SqlCommand cmd = new SqlCommand(query, conn);

                SQLclass.commandQuery(conn, cmd, query);
                SqlDataReader reader = cmd.ExecuteReader();

                if (reader.HasRows)
                {
                    usuario = new Usuario();                    

                    while (reader.Read())
                    {                    
                        usuario.IdUsuario= reader.GetInt32(0);

                        usuario.Nombre = reader.GetString(1);

                        usuario.Apellido = reader.GetString(2);

                        usuario.Dni = reader.GetString(3);

                        usuario.Username = reader.GetString(4);

                        usuario.Pass= reader.GetString(5);

                        usuario.Email = reader.GetString(6);

                        usuario.Tel = reader.GetString(7);

                        usuario.Cel = reader.GetString(8);
                        
                        usuario.Jerarquia= reader.GetString(9);
                        
                    }
                }
                else
                {
                    usuario = null;
                }
            }
            catch (Exception e)
            {
                CLogger.Append("[buscarUsuarioPorDNI] Exception : " + e, CLogger.ERROR);      //DEBUG
                throw new MiException("[buscarUsuarioPorDNI] Exception: " + e);
            }
            finally
            {
                conn.Close();
            }
            // CLogger.Append("[buscarNuevoUltimoIdProveedorEnBD] RETURN ID : " + ID, CLogger.ERROR);      //DEBUG
            return usuario;
        }

        #region BUSCAR USUARIO POR USERNAME
        public Usuario buscarUsuarioPorUserName(string username)
        {
            Usuario usuario = null;

            SqlConnection conn = SQLclass.conectarSQL();
            try
            {
                conn.Open();

                string query = "SELECT * FROM Usuario WHERE username='" + username+"'";
                SqlCommand cmd = new SqlCommand(query, conn);

                SQLclass.commandQuery(conn, cmd, query);
                SqlDataReader reader = cmd.ExecuteReader();

                if (reader.HasRows)
                {
                    usuario = new Usuario();

                    while (reader.Read())
                    {
                        usuario.IdUsuario = reader.GetInt32(0);

                        usuario.Nombre = reader.GetString(1);

                        usuario.Apellido = reader.GetString(2);

                        usuario.Dni = reader.GetString(3);

                        usuario.Username = reader.GetString(4);

                        usuario.Pass = reader.GetString(5);

                        usuario.Email = reader.GetString(6);

                        usuario.Tel = reader.GetString(7);

                        usuario.Cel = reader.GetString(8);

                        usuario.Jerarquia = reader.GetString(9);

                    }
                }
                else
                {
                    usuario = null;
                }
            }
            catch (Exception e)
            {
                CLogger.Append("[buscarUsuarioPorUserName] Exception : " + e, CLogger.ERROR);      //DEBUG
                throw new MiException("[buscarUsuarioPorUserName] Exception: " + e);
            }
            finally
            {
                conn.Close();
            }
            // CLogger.Append("[buscarNuevoUltimoIdProveedorEnBD] RETURN ID : " + ID, CLogger.ERROR);      //DEBUG
            return usuario;
        }
        #endregion

        #region OBTENER LISTA DE Usuarios
        public List<Usuario> obtenerListaUsuariosEnDB()
        {
            SqlConnection conn = SQLclass.conectarSQL();
            List<Usuario> lstUsuario = null;

            try
            {
                conn.Open();

                string query = "SELECT * FROM Usuario";
                SqlCommand cmd = new SqlCommand(query, conn);


                SQLclass.commandQuery(conn, cmd, query);
                SqlDataReader reader = cmd.ExecuteReader();

                if (reader.HasRows)
                {
                    lstUsuario = new List<Usuario>();


                    while (reader.Read())
                    {
                        Usuario user = new Usuario();

                        user.IdUsuario = reader.GetInt32(0);
                        user.Nombre = reader.GetString(1);
                        user.Apellido = reader.GetString(2);
                        user.Dni = reader.GetString(3);
                        user.Username = reader.GetString(4);
                        user.Pass = reader.GetString(5);
                        user.Email = reader.GetString(6);
                        user.Tel = reader.GetString(7);
                        user.Cel = reader.GetString(8);
                        user.Jerarquia = reader.GetString(9);

                        //CLogger.Append("[obtenerListaProveedoresEnBD] DATOS DEL PROV: ID: "+prov.IdProveedor +" RS: " +prov.RazonSocial, CLogger.INFO);      //DEBUG

                        lstUsuario.Add(user);
                    }

                }
                else
                {
                    lstUsuario = null;
                }
            }
            catch (Exception e)
            {
                CLogger.Append("[obtenerListaUsuariosEnBD] Exception obtener lista: " + e, CLogger.ERROR);      //DEBUG
                throw new MiException("[obtenerListaUsuariosEnBD] Exception obtener lista: " + e);
            }
            finally
            {
                conn.Close();
            }
            return lstUsuario;
        }
        #endregion

        #region Eliminar USUARIO POR ID

        public void eliminarUsuarioPorId(int id)
        {
            SqlConnection conn = SQLclass.conectarSQL();
            try
            {
                conn.Open();

                string query = "DELETE FROM Usuario WHERE ID=" + id.ToString();
                SqlCommand cmd = new SqlCommand(query, conn);
                cmd.ExecuteNonQuery();

            }
            catch (Exception e)
            {
                CLogger.Append("[eliminarUsuarioPorId] Exception : " + e, CLogger.ERROR);      //DEBUG
                throw new MiException("[eliminarUsuarioPorId] Exception: " + e);
            }
            finally
            {
                conn.Close();
            }
        }
        #endregion

        #region Eliminar Todos Los USUARIOs EN DB

        public void eliminarTodosLosUsuariosEnDb()
        {
            SqlConnection conn = SQLclass.conectarSQL();
            try
            {
                conn.Open();

                string query = "DELETE FROM Usuario ";
                SqlCommand cmd = new SqlCommand(query, conn);
                cmd.ExecuteNonQuery();

            }
            catch (Exception e)
            {
                CLogger.Append("[eliminarTodosLosUsuariosEnDb] Exception : " + e, CLogger.ERROR);      //DEBUG
                throw new MiException("[eliminarTodosLosUsuariosEnDb] Exception: " + e);
            }
            finally
            {
                conn.Close();
            }
        }
        #endregion
    }
}
